package com.sprouting.personal.controller;

import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import com.sprouting.personal.interfaces.common.Constant;
import com.sprouting.personal.model.common.ResultJson;
import com.sprouting.personal.model.entity.Config;
import com.sprouting.personal.model.vo.BirthdayPerson;
import com.sprouting.personal.model.vo.BirthdayVo;
import com.sprouting.personal.model.vo.LunarVo;
import com.sprouting.personal.service.ConfigService;
import com.sprouting.personal.service.MemberFamilyService;
import com.sprouting.personal.utils.CheckTool;
import com.sprouting.personal.utils.DateTool;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 生日提醒查询
 *
 * @author ：LX（长沙麓谷）
 * @date 创建时间： 2022/11/30 10:42
 */
@RequestMapping("/birthday")
@RestController
@Slf4j
public class BirthdayReminderController {

    @Autowired
    private MemberFamilyService memberFamilyService;
    @Autowired
    private ConfigService configService;


    /**
     * 获取生日人员，并进行分类
     * @return
     */
    @GetMapping("/getBirthdayList")
    public ResultJson getBirthdayList(){
        // 因为部分页面不需要登录，这一块是公共的，所以也不一定要登录才行，这里设置为非登录
        boolean login = StpUtil.isLogin();
        if (!login){
            log.warn("非登录状态，不进行数据获取！");
            return ResultJson.success();
        }

        BirthdayVo birthdayPerson = getBirthdayPerson();
        return ResultJson.success(birthdayPerson);
    }

    /**
     * 获取生日人员，页面标记小红点的位置数据
     * @return
     */
    // @GetMapping("/getBirthdayBadgeNum")
    public ResultJson getBirthdayBadgeNum(){
        BirthdayVo birthdayPerson = getBirthdayPerson();
        List<BirthdayPerson> soonList = birthdayPerson.getSoonList();
        if (CollUtil.isEmpty(soonList)){
            return ResultJson.success();
        }

        // 排序
        List<BirthdayPerson> sortList = soonList.stream().sorted(Comparator.comparing(BirthdayPerson::getSurplusTime)).collect(Collectors.toList());
        return ResultJson.success(sortList);
    }


    /**
     * 查询要生日的人员
     * 不做成定时任务的那种，而是人员登录上线之后就一直会开始刷新,考虑到某些用户根本不登录
     * @return
     */
    private BirthdayVo getBirthdayPerson(){
        List<BirthdayPerson> birthdayPersonList = memberFamilyService.getMemberFamilyByUserIdAll(StpUtil.getLoginIdAsString());
        if (CollUtil.isEmpty(birthdayPersonList)) {
            return new BirthdayVo();
        }

        // 阴历
        LunarVo lunarVo = DateTool.toLunar(new Date());
        // 获得生日
        // 有bug，必须用绝对值，否则会有负数
        String lunar = Math.abs(Integer.valueOf(lunarVo.getYearLunar())) + "-" + Math.abs(Integer.valueOf(lunarVo.getMonthLunar())) + "-" + Math.abs(Integer.valueOf(lunarVo.getDayLunar()));
        DateTime lunarDateTime = DateUtil.parseDate(lunar);
        int year = DateUtil.year(lunarDateTime);

        // 查询马上要生日的
        /*
        生日提醒这里暂时不做复杂，比如在生日提醒中去掉生日提醒这种功能，为何，主要是先将功能做出来，生日的话很可能会涉及到修改生日时间，又要对已忽略表进行数据修改，现在做这些
        太麻烦了，但思路还是很简单的，增加一个忽略表，这个忽略表记录了今年要生日提醒的人员，查询出要生日的人之后，经过这个表进行一次过滤，这样就不再次提醒，需要注意，这个表中要有年的信息，每次查询都要经过年来过滤
        但现在先不做这么复杂，后期在看
        这里还没处理特殊的时间，比如2月29日生日的，四年一润的话会有问题
        */
        for (BirthdayPerson birthdayPerson : birthdayPersonList){
            if (CheckTool.checkNull(birthdayPerson.getBirthdayTime())){
                continue;
            }
            if (birthdayPerson.getBeforeBirthday() == null){
                continue;
            }

            /// 先判断是否在这个时间范围内
            // 将日期转换为当年时间
            String birthdayTime = birthdayPerson.getBirthdayTime();
            String yearBirthdayTime = year + "-" + birthdayTime;
            DateTime birthday = DateUtil.parseDate(yearBirthdayTime);

            // 提前提醒时间
            int advance = birthdayPerson.getBeforeBirthday();
            // 生日范围时间,未来的终止时间
            DateTime future = DateUtil.offsetDay(lunarDateTime, advance);

            if (!DateUtil.isIn(birthday, lunarDateTime, future)){
                // 不在范围中
                continue;
            }

            // 判断离生日还有多久时间
            long betweenDay = DateUtil.betweenDay(lunarDateTime, birthday, true);
            birthdayPerson.setSurplusTime(betweenDay);
        }

        // 先过滤不为空的,为空的说明都还没有生日
        List<BirthdayPerson> collect = birthdayPersonList.stream().filter(obj -> obj.getSurplusTime() != null).collect(Collectors.toList());
        if (CollUtil.isEmpty(collect)){
            return new BirthdayVo();
        }

        // 分类后返回
        return classify(collect);
    }

    /**
     * 分类
     * @param collect 生日的人员
     */
    private BirthdayVo classify(List<BirthdayPerson> collect){
        BirthdayVo birthdayVo = new BirthdayVo();
        for (BirthdayPerson birthdayPerson : collect){
            Long surplusTime = birthdayPerson.getSurplusTime();

            List<BirthdayPerson> soonList = birthdayVo.getSoonList();
            soonList.add(birthdayPerson);

            if (surplusTime.equals(0L)){
                // 今天生日
                List<BirthdayPerson> list = birthdayVo.getTodayList();
                list.add(birthdayPerson);

            } else if (surplusTime.equals(1L)){
                List<BirthdayPerson> list = birthdayVo.getOneList();
                list.add(birthdayPerson);

            } else if (surplusTime.equals(2L)){
                List<BirthdayPerson> list = birthdayVo.getTwoList();
                list.add(birthdayPerson);

            } else if (surplusTime.equals(3L)){
                List<BirthdayPerson> list = birthdayVo.getThreeList();
                list.add(birthdayPerson);

            } else if (surplusTime.equals(4L)){
                List<BirthdayPerson> list = birthdayVo.getFourList();
                list.add(birthdayPerson);

            } else if (surplusTime.equals(5L)){
                List<BirthdayPerson> list = birthdayVo.getFiveList();
                list.add(birthdayPerson);

            } else {
                // 其他时间生日的
                List<BirthdayPerson> list = birthdayVo.getOtherList();
                list.add(birthdayPerson);
            }
        }

        return birthdayVo;
    }



}
